package br.usp.ime.protoc.genotipagem;

import java.util.HashSet;
import java.util.Iterator;

import com.google.gwt.user.client.rpc.IsSerializable;

import br.usp.ime.protoc.fujaba.FEmptyIterator;

public abstract class Genotipo implements IsSerializable
{
   private String funcao;

   public String getFuncao()
   {
      return this.funcao;
   }

   public void setFuncao(String value)
   {
      if (this.funcao != value)
      {
         
         this.funcao = value;
         
      }
   }

   private String localizacaoAbsoluta;

   public String getLocalizacaoAbsoluta()
   {
      return this.localizacaoAbsoluta;
   }

   public void setLocalizacaoAbsoluta(String value)
   {
      if (this.localizacaoAbsoluta != value)
      {
         
         this.localizacaoAbsoluta = value;
         
      }
   }

   private String localizacaoBanda;

   public String getLocalizacaoBanda()
   {
      return this.localizacaoBanda;
   }

   public void setLocalizacaoBanda(String value)
   {
      if (this.localizacaoBanda != value)
      {
         
         this.localizacaoBanda = value;
         
      }
   }

   /**
    * <pre>
    *           1..*       has       1..* 
    * Genotipo --------------------------- Genotipagem
    *           genotipo      genotipagem 
    * </pre>
    */
   private HashSet genotipagem;

   public boolean addToGenotipagem(Genotipagem value)
   {
      boolean changed = false;
      if (value != null)
      {
         if (this.genotipagem == null)
         {
            this.genotipagem = new HashSet (); // or FTreeSet () or FLinkedList ()
         }
         
         changed = this.genotipagem.add (value);
         if (changed)
         {
            value.addToGenotipo (this);
         }
         
      }
      return changed;
   }

   public boolean hasInGenotipagem(Genotipagem value)
   {
      return ((this.genotipagem != null) &&
              (value != null) &&
              this.genotipagem.contains (value));
   }

   public Iterator iteratorOfGenotipagem()
   {
      return ((this.genotipagem == null)
              ? FEmptyIterator.get ()
              : this.genotipagem.iterator ());
   }

   public void removeAllFromGenotipagem()
   {
      Genotipagem tmpValue;
      Iterator iter = this.iteratorOfGenotipagem ();
      while (iter.hasNext ())
      {
         tmpValue = (Genotipagem) iter.next ();
         this.removeFromGenotipagem (tmpValue);
      }
   }

   public boolean removeFromGenotipagem(Genotipagem value)
   {
      boolean changed = false;
      if ((this.genotipagem != null) && (value != null))
      {
         
         changed = this.genotipagem.remove (value);
         if (changed)
         {
            value.removeFromGenotipo (this);
         }
         
      }
      return changed;
   }

   public int sizeOfGenotipagem()
   {
      return ((this.genotipagem == null)
              ? 0
              : this.genotipagem.size ());
   }

   /**
    * <pre>
    *           1..*      has       1 
    * Genotipo ----------------------- Mutacao
    *           genotipo      mutacao 
    * </pre>
    */
   private Mutacao mutacao;

   public Mutacao getMutacao()
   {
      return this.mutacao;
   }

   public boolean setMutacao(Mutacao value)
   {
      boolean changed = false;
      if (this.mutacao != value)
      {
         Mutacao oldValue = this.mutacao;
         
         if (this.mutacao != null)
         {
            this.mutacao = null;
            oldValue.removeFromGenotipo (this);
         }
         this.mutacao = value;
         if (value != null)
         {
            value.addToGenotipo (this);
         }
         changed = true;
         
      }
      return changed;
   }

   public void removeYou()
   {
      Mutacao tmpMutacao = getMutacao ();
      if (tmpMutacao != null)
      {
         setMutacao (null);
      }
      removeAllFromGenotipagem ();
   }

}
